package com.kt.service.impl;

import com.kt.DTO.CartDTO;
import com.kt.dataobject.ProductInfo;
import com.kt.enums.ProductStatusEnum;
import com.kt.enums.ResultEnum;
import com.kt.exception.ProductException;
import com.kt.repository.ProductInfoRepository;
import com.kt.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


import javax.transaction.Transactional;
import java.util.List;
import java.util.Optional;

/**
 * Created by lenovo on 2019/1/11.
 */
@Service
public class ProductServiceImpl implements ProductService {
   @Autowired
   private ProductInfoRepository productInfoRepository;

    @Override
    public List<ProductInfo> findUpAll() {
        //ProductStatusEnum.UP.getCode()  获取上下架的一个状态 从枚举类当中
        return productInfoRepository.findByProductStatus(ProductStatusEnum.UP.getCode());
    }

    @Override
    public List<ProductInfo> findList(List<String> productIdList) {
        return productInfoRepository.findByProductIdIn(productIdList);
    }

    @Override
    //开启事务
    @Transactional
    public void decreaseStock(List<CartDTO>cartDTOList) {
        System.out.println("2");
        for(CartDTO cartDTO:cartDTOList){
            //Java 8 Optional 类
            //Optional 是个容器：它可以保存类型T的值，或者仅仅保存null。
            // Optional提供很多有用的方法，这样我们就不用显式进行空值检测。
       Optional <ProductInfo> ProductInfoInfoOptional=productInfoRepository.findById(cartDTO.getProductId());
        //判断他是否为空
        if(!ProductInfoInfoOptional.isPresent()){
            //商品不存在
        throw new ProductException(ResultEnum.PRODUCT_NOT_EXIST);
        }
        //如果值不为空则返回ProductInfoInfoOptional里面的值
        ProductInfo productInfo=ProductInfoInfoOptional.get();
        Integer result=productInfo.getProductStock()-cartDTO.getProductQuantity();
        //判断商品是否足够
        if(result<0){
            throw new ProductException(ResultEnum.PRODUCT_STOCK_ERROR);
        }
            productInfo.setProductStock(result);
            productInfoRepository.save(productInfo);
        }
    }
}
